// 声明一个对象，对对象的属性进行赋值，赋值的过程中进行劫持
let object = new Object()
object.show = function () {
  console.log(this)
}

// 定义对象的属性时，使用Object的set get方法
Object.defineProperty(object, 'name', {
  // 可以配置
  configurable: true,
  // 可以被遍历
  enumerable: true,
  // value，writable两个属性是不可以和set get方法同时存在
  get() {
    console.log('----------------get---------------------')
    return this._name
  },
  set(v) {
    console.log('----------------set---------------------')
    return (this._name = v)
  },
})
// 定义对象的属性时，使用Object的set get方法
Object.defineProperty(object, 'age', {
  // 可以配置
  configurable: true,
  // 可以被遍历
  enumerable: true,
  // value，writable两个属性是不可以和set get方法同时存在
  get() {
    console.log('----------------get---------------------')
    return this._age || 0
  },
  set(v) {
    console.log('----------------set---------------------')
    if (typeof v !== 'number' || v <= 0) {
      console.log('年龄必须是大于0的数字')
      v = 0
    }
    return (this._age = v)
  },
})
// 定义对象的属性时，使用Object的set get方法
Object.defineProperty(object, 'gender', {
  // 可以配置
  configurable: true,
  // 可以被遍历
  enumerable: true,
  // value，writable两个属性是不可以和set get方法同时存在
  get() {
    console.log('----------------gender:get---------------------')
    return this._gender || '女'
  },
  set(v) {
    console.log('----------------set---------------------')
    if (v !== '男' && v !== '女') {
      console.log('性别是男或女')
      v = '女'
    }
    return (this._gender = v)
  },
})

// object.name = 'tom'
// object.age = -10
// object.gender = 'ss'
// console.log(object.gender)
// object.show()

// 2 使用代理和反射实现对象属性的封装
// 3 使用class 私有化属性，提供公共的set的get方法进行操作
class Person {
  // 私有化属性
  #name = 'tom'
  #age = 18
  constructor() {}
  // 获得name
  setName(v) {
    this.#name = v
  }
  // 设置name
  getName() {
    return this.#name
  }
  setAge(v) {
    if (typeof v !== 'number' || v <= 0) {
      console.log('年龄必须是大于0的数字')
      v = 0
    }
    this.#age = v
  }
  getAge() {
    return this.#age
  }
}

let p = new Person()
p.setName('Sam')
console.log(p.getName())
p.setAge(-10)
console.log(p.getAge())
